package vip.xiaonuo.biz.modular.nccAi.util;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
import org.apache.commons.compress.archivers.zip.ZipArchiveInputStream;
import org.apache.commons.compress.utils.IOUtils;

import java.io.*;
import java.nio.charset.Charset;


@Slf4j
public class UnzipUtil {


    /**
     * 解压ZIP文件到指定目录，支持中文文件名
     * @param zipFilePath ZIP文件路径
     * @param destDirectory 解压目标目录
     * @throws IOException 如果发生IO错误
     */
    public static void extractZipFile(String zipFilePath, String destDirectory) throws IOException {
        // 创建目标目录（如果不存在）
        File destDir = new File(destDirectory);
        if (!destDir.exists()) {
            destDir.mkdirs();
        }

        // 使用GBK编码打开ZIP文件流，处理中文文件名
        try (InputStream fis = new FileInputStream(zipFilePath);
             BufferedInputStream bis = new BufferedInputStream(fis);
             ZipArchiveInputStream zis = new ZipArchiveInputStream(bis, "GBK", false)) {
            ZipArchiveEntry entry;
            // 遍历ZIP中的所有条目
            while ((entry = zis.getNextZipEntry()) != null) {
                if (entry.isDirectory()) {
                    // 创建目录
                    File dir = new File(destDirectory, entry.getName());
                    if (!dir.exists()) {
                        dir.mkdirs();
                    }
                } else {
                    // 创建文件并写入内容
                    File outputFile = new File(destDirectory, entry.getName());
                    // 确保父目录存在
                    File parentDir = outputFile.getParentFile();
                    if (!parentDir.exists()) {
                        parentDir.mkdirs();
                    }
                    try (OutputStream fos = new FileOutputStream(outputFile);
                         BufferedOutputStream bos = new BufferedOutputStream(fos)) {
                        // 使用IOUtils复制流，简化代码
                        IOUtils.copy(zis, bos);
                    }
                    System.out.println("已解压: " + entry.getName());
                }
            }
        } catch (UnsupportedEncodingException e) {
            System.err.println("不支持的编码格式: " + e.getMessage());
            throw e;
        }
    }

}
